//拿到数组的原型
let oldArrayProtoMethods = Array.prototype;

//将一个变量的原型链指向,数组的原型,原型式继承
export let arrsMethods = Object.create(Array.prototype)

let methods = [
    'push',
    'unshift',
    'shift',
    'pop',
    'splice',
    'reverse',
    'sort'
]

methods.forEach(method => {
    //切片编程AOP
    arrsMethods[method] = function (...args) {
        //console.log('数组变化了');
        let res = oldArrayProtoMethods[method].call(this, ...args)
        //用来判断是否调用了添加方法
        let inserted;
        /* 当前的this => 
            谁调用指向谁 => 
                this指向的就是value => 
                    value上有个_ob_属性,指向的是Observer实例 => 
                        Observer实例调用observeArray方法 */
        let ob=this._ob_;
        //根据不同的添加方法,获取对应的参数,作为标识
        switch (method) {
            case 'push':
            case 'unshift':
                inserted = args;
                break;
            case 'splice':
                inserted = args.slice(2);
            default:
                break;
        }
        //如果是添加方法,监听其参数并转化成响应式
        if (inserted) ob.observeArray(inserted)
        ob.dep.notify();
        return res;
    }
})
